﻿// Filename: UserBUS.cs
// Author: Giã Dương Đức Minh
// Email: giaduongducminh@gmail.com
// 
// Date created: 02/01/2012 (dd/mm/yyyy)
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Ryder_US_Website.Utils;

namespace Ryder_US_Website.BUS
{
    /// <summary>
    /// Ryder_US_Website.BUS.UserBUS
    /// 
    /// Team Breakers
    /// Author: Đức Minh GIÃ DƯƠNG (Breakers.Terry)
    /// Email: giaduongducminh@gmail.com
    /// </summary>
    public class UserBUS
    {
        public static string conString = ConfigurationManager.ConnectionStrings["breakers_RyderUSConnectionString"].ConnectionString;

        #region Select
        /// <summary>
        /// Get all users.
        /// </summary>
        /// <returns>List of RUS_User</returns>
        public static List<RUS_User> GetAll()
        {

            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                List<RUS_User> list = new List<RUS_User>();
                var query = from U in context.RUS_Users
                            orderby U.User_username ascending
                            select U;
                list = query.ToList<RUS_User>();
                return list;
            }

        }

        /// <summary>
        /// Gets all and paging.
        /// </summary>
        /// <param name="curPage">The current page.</param>
        /// <param name="rowsPerPage">The rows per page.</param>
        /// <param name="numPages">The number of pages.</param>
        /// <returns></returns>
        public static List<RUS_User> GetAll(int curPage, int rowsPerPage, ref int numPages)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {

                if (curPage < 1)
                    curPage = 1;
                if (rowsPerPage < 1)
                    rowsPerPage = 10;
                List<RUS_User> list = new List<RUS_User>();

                var query = from U in context.RUS_Users
                            orderby U.User_username ascending
                            select U;
                numPages = (query.Count() / rowsPerPage) + 1;
                query = query.OrderBy(u => u.User_username);
                list = query.Skip((curPage - 1) * rowsPerPage).Take(rowsPerPage).ToList<RUS_User>();

                return list;
            }
        }
        /// <summary>
        /// Get user by id.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns>RUS_User</returns>
        public static RUS_User GetUserByID(int id)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                RUS_User user = new RUS_User();
                var query = from U in context.RUS_Users
                            where U.User_ID.Equals(id)
                            select U;
                user = query.SingleOrDefault<RUS_User>();
                return user;
            }

        }


        /// <summary>
        /// Logins the specified username.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="password">The password.</param>
        /// <returns></returns>
        public static RUS_User Login(String username, String password)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không hợp lệ.");
                if (String.IsNullOrEmpty(password))
                    throw new Exception("Mật khẩu không hợp lệ.");
                RUS_User user = new RUS_User();

                var query = from u in context.RUS_Users
                            where (u.User_username == username) && (u.User_password == UtilHelpers.MD5Encode(password))
                            select u;
                if (query.Count() != 0)
                {
                    user = query.SingleOrDefault<RUS_User>();
                }
                else
                {
                    throw new Exception("Sai tên đăng nhập hoặc mật khẩu.");
                }
                return user;
            }
        }

        /// <summary>
        /// Checks the existed username.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <returns></returns>
        public static Boolean checkExistedUsername(String username)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                var query = from u in context.RUS_Users
                            where u.User_username == username
                            select u;
                if (query.Count() != 0)
                {
                    return true;
                }
                return false;
            }
        }

        /// <summary>
        /// Checks the existed username.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="id">The id.</param>
        /// <returns></returns>
        public static Boolean checkExistedUsername(String username, int id)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                var query = from u in context.RUS_Users
                            where u.User_username == username && u.User_ID != id
                            select u;
                if (query.Count() != 0)
                {
                    return true;
                }
                return false;
            }
        }
        #endregion

        #region Insert
        /// <summary>
        /// Inserts the specified user.
        /// </summary>
        /// <param name="user">The user.</param>
        public static void Insert(RUS_User user)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (user != null)
                {
                    if (checkExistedUsername(user.User_username))
                        throw new Exception("Đã tồn tại nhân viên này");
                    context.RUS_Users.InsertOnSubmit(user);
                }
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể thêm nhân viên mới được.");
                }
            }
        }

        /// <summary>
        /// Inserts the specified username.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="password">The password.</param>
        /// <param name="role">The role. 0: admin, 1: user.</param>
        public static void Insert(String username, String password, int role)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không được để trống.");
                if (checkExistedUsername(username))
                    throw new Exception("Đã tồn tại nhân viên này");
                if (String.IsNullOrEmpty(password))
                    throw new Exception("Mật khẩu không được để trống.");
                if (role != 0 && role != 1)
                    role = 1;
                RUS_User user = new RUS_User();
                user.User_username = username;
                user.User_password = UtilHelpers.MD5Encode(password);
                user.User_role = role;
                context.RUS_Users.InsertOnSubmit(user);
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể thêm nhân viên mới được.");
                }
            }
        }

        /// <summary>
        /// Inserts the admin.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="password">The password.</param>
        /// <returns>New user</returns>
        public static RUS_User InsertAdmin(String username, String password)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không được để trống.");
                if (checkExistedUsername(username))
                    throw new Exception("Đã tồn tại nhân viên này");
                if (String.IsNullOrEmpty(password))
                    throw new Exception("Mật khẩu không được để trống.");
                RUS_User user = new RUS_User();
                user.User_username = username;
                user.User_password = UtilHelpers.MD5Encode(password);
                user.User_role = 0;
                context.RUS_Users.InsertOnSubmit(user);
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể thêm nhân viên mới được.");
                }
                return user;
            }
        }

        /// <summary>
        /// Inserts the user.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="password">The password.</param>
        /// <returns>New user</returns>
        public static RUS_User InsertUser(String username, String password)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không được để trống.");
                if (checkExistedUsername(username))
                    throw new Exception("Đã tồn tại nhân viên này");
                if (String.IsNullOrEmpty(password))
                    throw new Exception("Mật khẩu không được để trống.");
                RUS_User user = new RUS_User();
                user.User_username = username;
                user.User_password = UtilHelpers.MD5Encode(password);
                user.User_role = 1;
                context.RUS_Users.InsertOnSubmit(user);
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể thêm nhân viên mới được.");
                }
                return user;
            }
        }
        #endregion

        #region Update
        /// <summary>
        /// Updates the specified user.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <returns>Updated user.</returns>
        public static RUS_User Update(RUS_User user)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                try
                {
                    if (user != null)
                    {
                        if (checkExistedUsername(user.User_username, user.User_ID))
                            throw new Exception("Đã tồn tại nhân viên này");
                        context.SubmitChanges();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể cập nhật nhân viên được.");
                }
                return user;
            }
        }

        /// <summary>
        /// Updates the specified username.
        /// </summary>
        /// <param name="username">The new username.</param>
        /// <param name="password">The new password.</param>
        /// <param name="role">The new role.</param>
        /// <param name="id">The user's id.</param>
        /// <returns>Updated user</returns>
        public static RUS_User Update(String username, String password, int role, int id)
        {

            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không được để trống.");
                if (checkExistedUsername(username, id))
                    throw new Exception("Đã tồn tại nhân viên này");
                if (String.IsNullOrEmpty(password))
                    throw new Exception("Mật khẩu không được để trống.");
                RUS_User user = new RUS_User();
                var query = from u in context.RUS_Users
                            where (u.User_ID == id)
                            select u;
                user = query.SingleOrDefault<RUS_User>();
                if (user != null)
                {
                    user.User_username = username;
                    user.User_password = UtilHelpers.MD5Encode(password);
                    user.User_role = role;
                }
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể cập nhật nhân viên được.");
                }
                return user;
            }
        }

        /// <summary>
        /// Update user without change password
        /// </summary>
        /// <param name="username">The new username.</param>
        /// <param name="role">The new role.</param>
        /// <param name="id">The user's id.</param>
        /// <returns>Updated user</returns>
        public static RUS_User Update(String username, int role, int id)
        {
            using (Breakers_RyderUSDataContext context = new Breakers_RyderUSDataContext(conString))
            {
                if (String.IsNullOrEmpty(username))
                    throw new Exception("Tên đăng nhập không được để trống.");
                if (checkExistedUsername(username, id))
                    throw new Exception("Đã tồn tại nhân viên này");
                RUS_User user = new RUS_User();
                var query = from u in context.RUS_Users
                            where (u.User_ID == id)
                            select u;
                user = query.SingleOrDefault<RUS_User>();
                if (user != null)
                {
                    user.User_username = username;
                    user.User_role = role;
                }
                try
                {
                    context.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw new Exception("Có lỗi xảy ra! Không thể cập nhật nhân viên được.");
                }
                return user;
            }
        }
        #endregion
    }
}
